﻿#define  _CRT_SECURE_NO_WARNINGS   1
#include <iostream>
using namespace std;

//多态：静态多态--编译    动态多态--运行
//多态(polymorphism)的概念：通俗来说，就是多种形态
//静态多态---模板函数和类模板
//动态多态---给对应的对象，就会做出对应的行为

//多态的实现条件：必须是基类的指针或引用调用虚函数。基类和派生类中，必须存在虚函数，而且要完成虚函数的重写。
//class Person {
//public:
//	virtual void BuyTicket() { cout << "买票-全价" << endl; }
//};
//class Student : public Person {
//public:
//	virtual void BuyTicket() { cout << "买票-打折" << endl; }		//虚函数重写
//};
//
//class Soldier : public Person {
//public:
//	virtual void BuyTicket() { cout << "买票-优先" << endl; }		//虚函数重写
//};
////构成虚函数的条件：两个函数的返回值，名字和参数类型相同
//void Func(Person* ptr)		//Person&ptr也OK
//{
//	// 这⾥可以看到虽然都是Person指针Ptr在调⽤BuyTicket
//	// 但是跟ptr没关系，⽽是由ptr指向的对象决定的。
//	ptr->BuyTicket();
//}
//
////派生类不对基类的函数进行复制
////基类的函数还是在基类中，当派生类调用基类的函数的时候，会先在基类中查找调用的函数，没有找到再去基类中查找
//int main()
//{
//	Person ps;
//	Student st;
//	Soldier s1;
//	Func(&ps);
//	Func(&st);
//	Func(&s1);
//	return 0;
//}


class A
{
public:
	virtual  ~A()
	{
		cout << "~A()" << endl;
	}

	//纯虚函数
	virtual void add(int x, int y) = 0;//在函数后面=0，就构成了。包含纯虚函数的类---抽象类



	//virtual void add1(int x, int y) = 0;
};
class B : public A {
public:
	virtual ~B()
	{
		cout << "~B()->delete:" << _p << endl;
		delete _p;
	}
	virtual void add(int x, int y) ;
protected:
	int* _p = new int[10];
};
// 只有派⽣类Student的析构函数重写了Person的析构函数，下⾯的delete对象调⽤析构函数，才能
//构成多态，才能保证p1和p2指向的对象正确的调⽤析构函数。

//析构函数会被编译器统一转化为destructor函数，所以析构函数构成虚函数的条件也满足了。
//有虚函数的类中，其大小除了自己的成员以外，还包含了一个虚表指针---指向虚函数表的指针

//多态的原理——就是虚函数表的存在

//内存：内核空间，栈，堆，数据段(静态区)，代码段（虚函数，普通函数，虚函数表）
int main()
{
	//A* p1 = new A;
	//A* p2 = new B;
	/*delete p1;
	delete p2;*/

	//抽象类是无法实例出对象的
	//A a1;
	B b1;
	return 0;
}